#pragma once

namespace solution_002
{

struct ListNode
{
    int val;
    ListNode* next;
    ListNode() : val(0), next(nullptr) { }
    ListNode(int x) : val(x), next(nullptr) { }
    ListNode(int x, ListNode* next) : val(x), next(next) { }
};

class Solution
{
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)
    {
        int carry = 0;
        ListNode l3;
        auto node = &l3;
        while (l1 || l2 || carry) {
            auto sum = carry;
            if (l1) {
                sum += l1->val;
                l1 = l1->next;
            }
            if (l2) {
                sum += l2->val;
                l2 = l2->next;
            }
            node->next = new ListNode(sum % 10);
            node = node->next;
            carry = sum / 10;
        }
        return l3.next;
    }
};

}  /* namespace solution_002 */

